/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.br.imovel.controller;

import com.br.imovel.ejb.AlunoEJBLocal;
import com.br.imovel.ejb.ModuloEJBLocal;
import com.br.imovel.ejb.SalaEJBLocal;
import com.br.imovel.ejb.TurmaEJBLocal;
import com.br.imovel.model.Aluno;
import com.br.imovel.model.Modulo;
import com.br.imovel.model.Sala;
import com.br.imovel.model.Turma;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

/**
 *
 * @author diego
 */
@ManagedBean(name = "turmaM")
@SessionScoped
public class TurmaMBean implements Serializable {

    @EJB
    private TurmaEJBLocal turmaEJB;
    @EJB
    private SalaEJBLocal salaEJB;
    @EJB
    private AlunoEJBLocal alunoEJB;
    @EJB
    private ModuloEJBLocal moduloEJB;
    private Turma entidade;
    private Turma[] entidadesSelecionadas;
    private DataModel entidades;
    private DataModel entidadesAlunos;
    private FacesMessage msg;
    private Logger log;
    private List<SelectItem> listaSalas;
    private List<SelectItem> listaModulos;

    public List<SelectItem> getListaModulos() {

        listaModulos = new ArrayList<SelectItem>();
        listaModulos.add(new SelectItem(null, ""));
        List<Modulo> modulos;
        try {
            modulos = moduloEJB.recuperaTodos();
            for (Modulo turma : modulos) {
                listaModulos.add(new SelectItem(turma.getId(), turma.getNome() + "- [" + turma.getId() + "]"));
            }
        } catch (Exception e) {
            empilhaMensagem(FacesMessage.SEVERITY_ERROR, "Erro eo recuperar lista de modulos", null);
            log.error("Erro eo recuperar lista de salas");
            listaModulos.add(new SelectItem(null, "Erro eo recuperar lista de modulos"));
        }
        return listaModulos;
    }

    public void setListaModulos(List<SelectItem> listaModulos) {
        this.listaModulos = listaModulos;
    }

    public DataModel getEntidadesAlunos() {
        if (this.getEntidade() == null && this.getEntidade().getAlunos() != null) {
            entidadesAlunos = new ListDataModel(this.getEntidade().getAlunos());
            return entidadesAlunos;
        }
        return null;
    }

    public void setEntidadesAlunos(DataModel entidadesAlunos) {
        this.entidadesAlunos = entidadesAlunos;
    }

    public List<SelectItem> getListaSalas() {
        listaSalas = new ArrayList<SelectItem>();
        listaSalas.add(new SelectItem(null, ""));
        List<Sala> salas;
        try {
            salas = salaEJB.recuperaTodos();
            for (Sala sala : salas) {
                listaSalas.add(new SelectItem(sala.getId(), sala.getNome() + "- [" + sala.getId() + "]"));
            }
        } catch (Exception e) {
            empilhaMensagem(FacesMessage.SEVERITY_ERROR, "Erro eo recuperar lista de salas", null);
            log.error("Erro eo recuperar lista de salas");
            listaSalas.add(new SelectItem(null, "Erro eo recuperar lista de salas"));
        }

        return listaSalas;
    }

    public void setListaSalas(List<SelectItem> listaSalas) {
        this.listaSalas = listaSalas;
    }

    public TurmaMBean() {

        log = Logger.getLogger(TurmaMBean.class);
        BasicConfigurator.configure();
        log.setLevel(Level.ALL);
        log.info("entrou no construtor");
        iniciaDados();

    }

    private void iniciaDados() {

        this.entidades = null;
        this.entidade = new Turma();
        selectedAlunos = new ArrayList<String>();
        this.entidade.setSala(new Sala());
        this.entidade.setModulo(new Modulo());
        this.alunos = new HashMap<String, Long>();
        this.entidadesSelecionadas = null;
        log.trace("Limpar dados das  Entidades :");

    }

    public Turma[] getEntidadesSelecionadas() {
        return entidadesSelecionadas;
    }

    public void setEntidadesSelecionadas(Turma[] entidadesSelecionadas) {
        this.entidadesSelecionadas = entidadesSelecionadas;
    }

    public void log(String mensagem, Level level, Exception e) {
        if (level == Level.FATAL) {
            log.fatal(System.currentTimeMillis() + mensagem, e);
        } else if (level == Level.ERROR) {
            log.error(System.currentTimeMillis() + mensagem, e);
        } else if (level == Level.WARN) {
            log.warn(System.currentTimeMillis() + mensagem, e);
        } else if (level == Level.INFO) {
            log.info(System.currentTimeMillis() + mensagem, e);
        } else if (level == Level.TRACE) {
            log.trace(System.currentTimeMillis() + mensagem, e);
        }

    }

    public Turma getEntidade() {
        populaListaAlunos();
        return entidade;
    }

    public void setEntidade(Turma entidade) {
        this.entidade = entidade;
        log.trace("setEntidade:" + entidade);
        selectedAlunos.clear();
        if (this.getEntidade().getAlunos() != null && !this.getEntidade().getAlunos().isEmpty()) {
            for (Aluno alunoTem : this.getEntidade().getAlunos()) {
                selectedAlunos.add(alunoTem.getId().toString());
            }
        }

        log.info("prepara Adicionar entidade :" + entidade);

    }

    public void prepararAdicionarEntidade() {
        this.entidade = new Turma();
        this.getEntidade().setSala(new Sala());

        this.getEntidade().setModulo(new Modulo());

        selectedAlunos = null;

        log.info("prepara Adicionar entidade :" + entidade);


    }

    public void setEntidadeDuplicar(Turma entidade) {
        this.entidade = entidade;
        this.entidade.setId(null);
        log.trace("setEntidadeDuplicar:" + entidade);

    }

    public DataModel getEntidades() {
        if (entidades == null) {
            List<Turma> lista = turmaEJB.recuperaTodos();
            log.trace("getEntidades :" + lista);
            entidades = new ListDataModel(lista);
        }
        return entidades;
    }

    public void setEntidades(DataModel entidades) {
        this.entidades = entidades;
    }

    public void prepararDuplicarEntidade() {
        this.entidade.setId(null);
        log.info("prepara Duplicar Entidade :" + entidade);
    }

    public void salvaEntidade() {
        List<Aluno> alunos = new ArrayList<Aluno>();

        for (int i = 0; i < selectedAlunos.size(); i++) {
            Long idAluno = Long.parseLong(selectedAlunos.get(i));

            alunos.add(alunoEJB.recupera(idAluno));
        }

        this.getEntidade().setAlunos(alunos);

        if (this.getEntidade() != null) {
            if (this.getEntidade().getId() == null) {
                turmaEJB.novo(entidade);
                empilhaMensagem(FacesMessage.SEVERITY_INFO, "Registro salvo com sucesso " + entidade.getNome(), null);

            } else {
                Sala s = salaEJB.recupera(entidade.getSala().getId());
                entidade.setSala(s);

                Modulo m = moduloEJB.recupera(entidade.getModulo().getId());
                entidade.setModulo(m);
                empilhaMensagem(FacesMessage.SEVERITY_INFO, "Registro atualizado com sucesso " + entidade.getNome(), null);
                turmaEJB.atualiza(entidade);
            }
            iniciaDados();
        }
    }

    public void removerEntidade() {
        log.info("Remover  Entidade :" + entidade);
        turmaEJB.remove(entidade);
        empilhaMensagem(FacesMessage.SEVERITY_INFO, "Registro removido com sucesso " + entidade.getNome(), null);
        iniciaDados();
    }

    public void removerEntidadesSelecionadas() {
        log.trace("Remover  Entidades Selecionadas :" + entidadesSelecionadas);
        empilhaMensagem(FacesMessage.SEVERITY_INFO, "Registros removidos  com sucesso, total de  " + this.entidadesSelecionadas.length, null);
        for (Turma entidadeAtual : entidadesSelecionadas) {
            turmaEJB.remove(entidadeAtual);
        }
        iniciaDados();
    }

    private void empilhaMensagem(FacesMessage.Severity tipoMensagem, String titulo, String mensagem) {
        msg = new FacesMessage(tipoMensagem, titulo, mensagem);
        FacesContext.getCurrentInstance().addMessage(null, this.msg);

    }
    //////////

    private void populaListaAlunos() {

        alunos = new HashMap<String, Long>();

        for (Aluno aluno : alunoEJB.recuperaTodos()) {
            alunos.put(aluno.getNome(), aluno.getId());
        }

    }
    private List<String> selectedAlunos;
    private Map<String, Long> alunos;

    public List<String> getSelectedAlunos() {
        return selectedAlunos;
    }

    public void setSelectedAlunos(List<String> selectedAlunos) {
        this.selectedAlunos = selectedAlunos;
    }

    public Map<String, Long> getAlunos() {
        return alunos;
    }
}
